package com.heima.leetcode.practice;

/**
 * @author 勾新杰
 * @version 1.0
 * @description: leetcode 43. 字符串相乘
 * @date 2025/3/15 21:25
 */
public class E43 {

    /**
     * <h3>方法一：按照平常算乘法的方式来</h3>
     *
     * @param num1 数字1
     * @param num2 数字2
     * @return 相乘后的结果
     */
    public String multiply(String num1, String num2) {
        // 1. 如果其中一个数字为0，则直接返回0
        if ("0".equals(num1) || "0".equals(num2)) return "0";
        // 2. 转成char[]数组，方便取值，效率快
        char[] digits1 = num1.toCharArray();
        char[] digits2 = num2.toCharArray();
        // 3. 准备一个长度为两个数字之和的数组，用于存储乘积的结果，两个数的乘积的最长位数就是两数位数之和
        int[] result = new int[digits1.length + digits2.length];
        // 4. 从右往左遍历两个数字，模拟计算
        for (int i = digits2.length - 1; i >= 0; i--) {
            // 4.1 取出乘数2的从后往前的当前位数字
            int mul1 = digits2[i] - '0';
            // 4.2 依次乘以乘数1的从后往前的当前位数字并相加
            for (int j = digits1.length - 1; j >= 0; j--) {
                int mul2 = digits1[j] - '0';
                int mul = mul1 * mul2;
                // 索引可以用特殊值来直接得出索引转换关系
                int sum = mul + result[i + j + 1];
                result[i + j + 1] = sum % 10;
                result[i + j] += sum / 10; // 不要忘了加上本来就有的数字
            }
        }
        StringBuilder builder = new StringBuilder();
        // 5. 拼接结果（要去掉先导零）
        boolean flag = false;
        for (int num : result) {
            if (num > 0) flag = true;
            if (flag) builder.append(num);
        }
        // 6. 返回结果
        return builder.toString();
    }
}
